﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;

namespace Formation_Entreprise
{
    //Formulaire qui contient toutes les options d'administration
    public partial class frmOptionsAdmin : Form
    {
        public frmOptionsAdmin()
        {
            InitializeComponent();
        }

        private void frmOptionsAdmin_Load(object sender, EventArgs e)
        {
            // Initialisation de l'appel du formulaire parent
            frmMain formMain = (frmMain)this.MdiParent;

            // Initialiser le progressbar pour load des usagers
            int nbreUsager = AccesTableUsager.ListerUsagers().Count;
            formMain.SetProgressBarValue(nbreUsager);
            formMain.lblStatut.Text = "Chargement des usagers...";
            // Population du ListBox Usager et step du progressbar
            for (int i = 0; i < nbreUsager; i++)
            {
                formMain.PerformStepProgressBar();
                this.lbUsager.Items.Add("ID : " + AccesTableUsager.ListerUsagers()[i].ID);
            }

            // Initialiser le progressbar pour load des entreprises
            int nbreEntreprise = AccesTableEntreprise.ListerEntreprises().Count;
            formMain.SetProgressBarValue(nbreEntreprise);
            formMain.lblStatut.Text = "Chargement des entreprises...";
            // Population du Combo Box Entreprise et de la liste et step du progressbar
            for (int i = 0; i < nbreEntreprise; i++)
            {
                formMain.PerformStepProgressBar();
                this.cbEntreprises.Items.Add(AccesTableEntreprise.ListerEntreprises()[i].Entreprise);
            }
            // Dire que le chargement est effectué
            formMain.lblStatut.Text = "Chargement effectué avec succès!";
            formMain.ResetToolStrip();

            // Initialiser les dimensions du formulaire
            this.gbUsagersIncrits.Height = 64;
            this.tabControl1.Height = 435;
            this.Height = 470;
        }

        #region TabUsagers
        //Enregistrer un nouvel usager
        private void btnEnregistrer_Click(object sender, EventArgs e)
        {
            //Vérifier si le mot de passe du compte et du email, correspondent aux textboxs de vérification
            if (txtPassword.Text.Equals(txtConfirmPass.Text) && txtPassEmail.Text.Equals(txtConfirmPassEmail.Text))
            {
                bool verification = false;
                bool admin = false;
                //Voir si le nouvel usager dispose des droits d'admin
                if (chkAdministration.Checked == true)
                    admin = true;
                //vérifier si tous les champs sont remplis
                verification = VerifierChamps();
                if (verification == true)
                {
                    //création d'un nouvel objet usager
                    objUsager usager = new objUsager(txtID.Text, txtNom.Text, txtPassword.Text, txtEmail.Text, txtPassEmail.Text, admin);
                    //Appel de la méthode d'ajout d'usager
                    AccesTableUsager.AjouterUsager(usager);
                    //Message de confirmation
                    MessageBox.Show("L'usager " + usager.ID + " a été créée avec succès", "création réussie", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    //reinisialiser les textboxs et checkbox
                    Reinitialiser();
               }
                else
                    MessageBox.Show("Tous les champs ne sont pas remplis correctement", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
                MessageBox.Show("Les mots de passe ne correspondent pas à leurs confirmation, veuillez vérifier et réessayer", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        //Vérification des champs de création d'usager
        private bool VerifierChamps()
        {
            string ID = this.txtID.Text;
            string pass = this.txtPassword.Text;
            bool Verification = false;

            // Test des champs du formulaire afin qu'il 
            // n'y en ai pas de vide & gestion des champs vides
            if (ID.ToString() == string.Empty || ID.Length < 4 || ID.Length > 12)
            {
                // Le champ Username est vide alors on envoie un message et on donne
                // le focus à txtUsername afin que le client entre une donnée valide.
                lblErrorNom.Visible = true;
                txtID.Select(0, txtID.TextLength);
                txtID.Focus();
                Verification = false;
            }
            else if (pass.ToString() == string.Empty ||pass.Length < 4)
            {
                // Le champ Password est vide alors on envoie un message et on donne
                // le focus à txtUsername afin que le client entre une donnée valide.
                lblErrorPass.Visible = true;
                txtPassword.Select(0, txtPassword.TextLength);
                txtPassword.Focus();
                Verification = false;
            }
            else
                Verification = true;
            return Verification;
        }

        //Reinitialiser les textboxs, bouton, et les lablels reliers a l'ajout d'un nouvel usager
        private void Reinitialiser()
        {
            txtID.Text = string.Empty;
            txtNom.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtPassEmail.Text = string.Empty;
            txtConfirmPassEmail.Text = string.Empty;
            txtPassword.Text = string.Empty;
            txtConfirmPass.Text = string.Empty;
            btnEnregistrer.Enabled = false;
            chkAdministration.Checked = false;
            lblError.Visible = false;
            lblErrorPass.Visible = false;
            lblErrorNom.Visible = false;
        }

        //Vérification s'il y a des champs vides
        private void VerifierVides()
        {
            if (txtID.Text != string.Empty && txtNom.Text != string.Empty && txtPassword.Text != string.Empty && txtConfirmPass.Text != string.Empty && txtEmail.Text != string.Empty && txtPassEmail.Text != string.Empty && txtConfirmPassEmail.Text != string.Empty)
                btnEnregistrer.Enabled = true;
            else
                btnEnregistrer.Enabled = false;
        }

        //Vérifier si le email est dans le bon format
        private void txtEmail_Leave(object sender, EventArgs e)
        {
            // Condition du format d'entré pour le courriel
            Match matchCourriel = Regex.Match(txtEmail.Text,
                @"^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-z]{2,4}$");

            if (matchCourriel.Success)
            {
                lblError.Visible = false;
            }
            else
            {
                lblError.Visible = true;
            }
        }

        //***********************************//
        //***********Bloc de keypress********//
        //***********************************//
        private void txtID_KeyPress(object sender, KeyPressEventArgs e)
        {
            VerifierVides();
        }

        private void txtNom_KeyPress(object sender, KeyPressEventArgs e)
        {
            VerifierVides();
        }

        private void txtPassword_KeyPress(object sender, KeyPressEventArgs e)
        {
            VerifierVides();
        }

        private void txtConfirmPass_KeyPress(object sender, KeyPressEventArgs e)
        {
            VerifierVides();
        }

        private void txtEmail_KeyPress(object sender, KeyPressEventArgs e)
        {
            VerifierVides();
        }

        private void txtPassEmail_KeyPress(object sender, KeyPressEventArgs e)
        {
            VerifierVides();
        }

        private void txtConfirmPassEmail_KeyPress(object sender, KeyPressEventArgs e)
        {
            VerifierVides();
        }

        //Bouton d'affichage des usagers existants
        private void btnAfficherUsagers_Click(object sender, EventArgs e)
        {
            //Propriétés du formulaires
            this.lbUsager.Visible = true;
            this.gbUsagersIncrits.Height = 235;
            this.tabControl1.Height = 603;
            this.Height = 641;
            this.btnAfficherUsagers.Visible = false;
            this.btnMasquerUsager.Visible = true;
        }

        //Bouton pour masquer la liste des usagers
        private void btnMasquerUsager_Click(object sender, EventArgs e)
        {
            //Propriétés du formulaires
            this.btnSupprimerUsager.Enabled = false;
            this.lbUsager.Visible = false;
            this.gbUsagersIncrits.Height = 64;
            this.tabControl1.Height = 432;
            this.Height = 470;
            this.btnAfficherUsagers.Visible = true;
            this.btnMasquerUsager.Visible = false;
        }

        //Mettre le bouton de supression enable a true
        private void lbUsager_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnSupprimerUsager.Enabled = true;
        }

        //Bouton de suppression d'usagers
        private void btnSupprimerUsager_Click(object sender, EventArgs e)
        {
            //déclaration de variables
            string nomUsager = string.Empty;
            string[] usagers;
            usagers = lbUsager.SelectedItem.ToString().Split(':');
            nomUsager = usagers[1].Trim();
            //confirmation de la suppression
            DialogResult dlgResult = MessageBox.Show("Voulez vous vraiment vous proceder à la suppression?", "Suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dlgResult == DialogResult.Yes)
            {
                //Appel de la fonction de supression d'ausager et supression dans la liste d'affichage
                int i = AccesTableUsager.SuprimerUsager(nomUsager);
                if (i == 0)
                {
                    MessageBox.Show("Une erreur s'est produite, l'élément n'a pas été supprimé,\n Veuillez vérifier qu'un autre utilisateur n'a pas déjà supprimer celui-ci", "Suppression", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    lbUsager.Items.RemoveAt(lbUsager.SelectedIndex);
                }
            }
            btnSupprimerUsager.Enabled = false;
        }
        #endregion

        #region TabEntreprises

        // Mettre le path de l'entreprise sélectionnée dans le textbox
        private void cbEntreprises_SelectedIndexChanged(object sender, EventArgs e)
        {
            string nomentreprise = (string)cbEntreprises.SelectedItem;
            objEntreprise oE = AccesTableEntreprise.ObtenirInformationEntreprise(nomentreprise);
            this.txtRepertoireActuel.Text = oE.Path;
        }

        // Modifier le répertoire de l'entreprise
        private void btnModification_Click(object sender, EventArgs e)
        {
            // Déclaration de variables
            objEntreprise oE = new objEntreprise();
            string sourcePath = txtRepertoireActuel.Text;
            string destPath = txtNouvRepertoire.Text;

            // Appel de la méthode de déplacement de répertoire
            ManipulationFichier.DeplacementRepertoire(sourcePath, destPath);
            try
            {
                // Modification du répertoire
                oE.Entreprise = (string)cbEntreprises.SelectedItem;
                oE.Path = destPath;
                AccesTableEntreprise.ModifierRepertoire(oE);
                // Message de confirmation du déplament du repertoire 
                MessageBox.Show("Le répertoire de l'entreprise" + oE.Entreprise + "à été " +
                                "modifier avec succès, si pour une raison inconnue vous ne " +
                                "trouver plus vos fichiers ils on été copier dans le dossier 'Backup'.");
            }
            catch (Exception ex) { MessageBox.Show("Une erreur s'est produite"); }
        }

        // Parcourir le nouveau répertoire de l'entreprise
        private void btnParcourir_Click(object sender, EventArgs e)
        {
            // AFFICHAGE d'un FolderBrowserDialog afin de selectionner
            // le fichier a associer à une nouvelle entreprise.
            FolderBrowserDialog fbdPathClient = new FolderBrowserDialog();
            DialogResult reponse = fbdPathClient.ShowDialog();

            // SI l'utilisateur confirme le fichier avec FolderBrowserDialog
            // on inscrit le chemin d'acces dans la boite de texte approprié.
            if (reponse == DialogResult.OK)
                txtNouvRepertoire.Text = fbdPathClient.SelectedPath;
        }

     
        #endregion

        #region TabDataBase

        // Enable le bouton de modification de repertoire
        private void txtNouvRepertoire_TextChanged(object sender, EventArgs e)
        {
            btnModification.Enabled = true;
        }

        // Nettoyage de la base de donnée
        private void btnNettoyer_Click(object sender, EventArgs e)
        {
            // Appel de la fonction de nettoyage
            if (CompactBD.CompactAccessDB(ConnectionBD.ObtenirConnectionString(), "BdEntreprise.mdb"))
                MessageBox.Show("Le nettoyage de la base de donnée a été effectué avec succès");
            else
                MessageBox.Show("Une erreur c'est produite");
        }

        #endregion

        #region TabConseillers
        //Créer un nouveau conseiller
        private void btnCreationConseiller_Click(object sender, EventArgs e)
        {
            bool actif = false;
            if (this.cbActif.Checked)
                actif = true;
            bool verification = VerifierChampsConseiller();
            DateTime date = new DateTime(dtpEmbauche.Value.Year, dtpEmbauche.Value.Month, dtpEmbauche.Value.Day);
            if (verification)
            {
                //Cération de l'objet conseiller
                objConseiller conseiller = new objConseiller(txtNomComplet.Text, txtTitre.Text, txtAdresse.Text, txtPoste.Text, Convert.ToInt32(txtNoBureau.Text), txtTelBureau.Text, txtTelResidence.Text, txtFax.Text, date ,actif);
                //Ajout du conseiller dans la base de donnée
                AccesTableConseiller.AjouterConseiller(conseiller);
                //afficher le message de confirmation
                MessageBox.Show("Le conseiller " + conseiller.Nom + " a été créée avec succès", "création réussie", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ReinitialiserChampsConseiller();
            }
            else
                MessageBox.Show("Tous les champs ne sont pas remplis correctement", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

        }

        //réinitialiser les champs du formulaire de cretaion de conseillers
        private void ReinitialiserChampsConseiller()
        {
            txtNomComplet.Text = string.Empty;
            txtTitre.Text = string.Empty;
            txtAdresse.Text = string.Empty;
            txtPoste.Text = string.Empty;
            txtNoBureau.Text = string.Empty;
            txtTelBureau.Text = string.Empty;
            txtTelResidence.Text = string.Empty;
            txtFax.Text = string.Empty;
            cbActif.Checked = false;
        }

        //vérifier si les champs sont pleins
        private bool VerifierChampsConseiller()
        {
            if (txtNomComplet.Text != string.Empty ||
                txtTitre.Text != string.Empty ||
                txtAdresse.Text != string.Empty ||
                txtPoste.Text != string.Empty ||
                txtNoBureau.Text != string.Empty ||
                txtTelBureau.Text != string.Empty ||
                txtTelResidence.Text != string.Empty ||
                txtFax.Text != string.Empty)
            {
                return true;
            }
            else
                return false;
        }
        #endregion      

        private void btnConnection_Click(object sender, EventArgs e)
        {
            // AFFICHAGE d'un FolderBrowserDialog afin de selectionner
            // le fichier a associer à une nouvelle entreprise.
            OpenFileDialog fdPathBD = new OpenFileDialog();
            fdPathBD.InitialDirectory = "C:\\";
            fdPathBD.Filter = "Base de données (*.mdb)|*.mdb";
            fdPathBD.FilterIndex = 1;

            if (fdPathBD.ShowDialog() == DialogResult.OK)
            {
                string filename = Path.GetFileName(fdPathBD.FileName);
                string path = Path.GetDirectoryName(fdPathBD.FileName);
                ConnectionBD.ModifierConnectionString(Path.Combine(path, filename).ToString());
            }
        }

    }
}
